# _*_ coding: UTF-8 _*_
# @Time     : 2021/10/27 下午 02:01
# @Author   : Li Jie
# @Site     : http://www.hzdledu.cn/
# @File     : c11s2_面对对象程序设计.py
# @Software : PyCharm

# 类是对象的模板，是对象的抽象
# 对象是类的实例，是类的实例化

# 定义类
class Dog:
    # 属性：静态特征
    class_name = "狗"  # 类变量：所有对象所公有的变量

    # 方法：动态特征
    # 构造方法：名字是固定的__init__,作用是完成对象属性的初始化（构造对象），它在生成对象时自动调用，类中必有构造方法
    def __init__(self, name, color):
        self.name = name  # 对象变量：定义在方法中，以self.定义，作用域在整个类中
        self.color = color
        n = 10  # 局部变量：作用只在方法内

    # 对象方法：可以访问对象变量和类变量
    # self：当前对象
    def eat(self):
        print(f'{self.name}正在啃骨头')

    def bark(self):
        print('旺旺旺')

    # 类方法:只能访问类变量
    @classmethod
    def rename_class_name(cls, name):
        cls.class_name = name

    # 静态方法：只能访问局部变量
    @staticmethod
    def foo(x):
        print(x)


# 练习：创建一个名为User 的类，其中包含属性first_name 和last_name 。
# 在类User 中定义一个名 为describe_user() 的方法，它打印用户的first_name和last_name；
# 再定义一个名为greet_user() 的方法，它向用户发出个性化的问候（hello +first_name+last_name）。
# 创建多个表示不同用户的实例，并对每个实例都调用上述两个方法。
class User():
    def __init__(self, first, last):
        self.first_name = first
        self.last_name = last

    def describe_user(self):
        print(f'我是{self.last_name}{self.first_name}')

    def greet_user(self):
        print(f'你好，{self.last_name}{self.first_name}')


if __name__ == '__main__':
    # 根据类生成对象
    xiaohuangdog = Dog('小黄', '黄色')
    xiaobaidog = Dog('小白', '白色')

    # 调用对象的属性和方法
    print(Dog.class_name)  # 调用类变量
    print(xiaohuangdog.name)  # 调用对象变量
    print(xiaohuangdog.color)  # 调用对象变量

    xiaohuangdog.eat()  # 调用对象方法
    xiaohuangdog.bark()  # 调用对象方法

    zhangsan = User('三','张')
    lisi = User('四','李')
    zhangsan.describe_user()
    zhangsan.greet_user()
